package main

import (
	"fmt"
	"net"
	"strings"
)

func main() {
	// 创建监听
	ip := "127.0.0.1"
	port := 8848
	address := fmt.Sprintf("%s:%d", ip, port)
	// 也可以这样写，冒号前面默认是本机：127.0.0.1
	// net.Listen("tcp", ":8848")
	// 也可以写完整：net.Listen("tcp", "127.0.0.1:8848")
	// 方法：
	// func Listen(network, address string) (Listener, error) {
	// 	var lc ListenConfig
	// 	return lc.Listen(context.Background(), network, address)
	// }
	listener, err := net.Listen("tcp", address)
	if err != nil {
		fmt.Println("net.Listen() err:", err)
		return
	}

	// 需求：server可以接收多个连接，每个连接可以处理多次数据
	// 需要两个协程，主go程负责监听，子go程负责处理数据
	for {
		fmt.Println("监听中……")
		// Accept() (Conn, error)
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("listener.Accept() err:", err)
			return
		}
		fmt.Println("连接建立成功！")

		go dataHandler(conn)
	}
}

// 创建一个单独的函数处理数据
func dataHandler(conn net.Conn) {
	for {
		// 创建容器用于读取到的数据
		buf := make([]byte, 1024) // 需要使用make来创建切片
		cnt, err := conn.Read(buf)
		if err != nil {
			fmt.Println("conn.Read() err:", err)
			return
		}
		fmt.Println("从Client读取到的数据，长度：", cnt)
		fmt.Println("读取到的数据：", string(buf[:cnt]))

		// 将数据转换成大写
		upperString := strings.ToUpper(string(buf))
		fmt.Println("转换成大写：", upperString)

		cnt, err = conn.Write([]byte(upperString))
		if err != nil {
			fmt.Println("conn.Write() err:", err)
			return
		}
		fmt.Println("向Client发送数据，长度：", cnt)
		fmt.Println("发送的数据：", upperString)
		// println("关闭连接")
	}
	// 关闭链接
	// _ = conn.Close()
}
